import os

# 定义unraid中的下载路径，用于硬链接的目标节点
download_dir_prefix = os.getenv("HL_DOWNLOAD_DIR", "/downloads/")
# 定义unraid共享的data路径，即jellyfin读取的文件路径，以及需要制作硬链接的路径
data_dir_prefix = os.getenv("HL_DATA_DIR", "/media/")


def make_link(source):
    """
    在media目录中创建指定目录中的文件的硬链接,为unraid而不是docker中的路径

    :param source: 源目录，即downloads中的某个目录的完整路径
    :return:
    """
    # 得到downloads目录下的相对路径，如category/file_dir_name
    dl_rel = os.path.relpath(source, download_dir_prefix)
    category, _ = os.path.split(dl_rel)
    if os.path.exists(os.path.join(data_dir_prefix, category)):
        # 确保此分类在data中存在，即需要共享该分类
        for root, _, files in os.walk(source):
            # 遍历目录内的所有文件
            for file in files:
                r_path = os.path.relpath(os.path.join(root, file), download_dir_prefix)
                dl_file = os.path.join(download_dir_prefix, r_path)
                dt_file = os.path.join(data_dir_prefix, r_path)
                if not os.path.exists(dt_file):
                    # data目录下没有该文件
                    dirname = os.path.dirname(dt_file)
                    if not os.path.exists(dirname):
                        os.makedirs(dirname)
                    print("create link: %s -> %s" % (dt_file, dl_file))
                    os.link(dl_file, dt_file)


def create_link_all():
    """
    在data目录中创建downloads目录中对应文件的硬链接

    :return: None
    """
    sub_dirs = os.listdir(download_dir_prefix)
    for dr in sub_dirs:
        if dr == 'incomplete':
            # 跳过incomplete目录
            continue
        # 拼接完整的分类下载路径
        dl_dir = os.path.join(download_dir_prefix, dr)
        # 获取data目录对应的路径
        dt_dir = os.path.join(data_dir_prefix, dr)
        # 必须两个位置均有对应的目录时，才创建链接
        if os.path.exists(dt_dir) and os.path.exists(dl_dir):
            for root, _, files in os.walk(dl_dir):
                """
                root: 当前目录
                files: 文件列表
                """
                for file in files:
                    # 跳过未完成的文件
                    if file.endswith('.!qB'):
                        continue
                    # 获取文件相对于分类目录的相对路径
                    r_path = os.path.relpath(os.path.join(root, file), dl_dir)
                    dl_file = os.path.join(dl_dir, r_path)
                    # 计算data目录下对应的路径
                    dt_file = os.path.join(dt_dir, r_path)
                    if os.path.isfile(dl_file):
                        # 检查data目录下是否有对应的链接
                        if not os.path.exists(dt_file):
                            # 确保文件所处的目录存在
                            dirname = os.path.dirname(dt_file)
                            if not os.path.exists(dirname):
                                os.makedirs(dirname)
                            # 创建硬链接
                            print("create link: %s -> %s" % (dt_file, dl_file))
                            os.link(dl_file, dt_file)


def create_link(target, dpath_in_qbit='/downloads'):
    """
    为指定目录中的文件创建硬链接

    :param dpath_in_qbit: qbit中的下载文件夹的前缀路径，注意不是unraid的下载路径！
    :param target: 需要创建硬链接的目录的完整地址
    :return: None
    """
    # 获取相对路径
    relpath = os.path.relpath(target, dpath_in_qbit)
    d = os.path.join(download_dir_prefix, relpath)
    make_link(d)


if __name__ == "__main__":
    create_link_all()
    # make_link('D:\\400-Other\\Temp\\downloads\\movie\\movieB')
